---
id: deploy-docker
title: 28.2 在 Docker 部署
sidebar_label: 28.2 在 Docker 部署
---

import useBaseUrl from "@docusaurus/useBaseUrl";

## 28.2.1 关于 `Docker` 部署

在 `Docker` 中部署网站有两种方式：

- `发布后构建`：此方式是先发布网站后在再构建镜像，这样可以减少不必要的构建层，而且还能缩减镜像大小。**（推荐）**
- `编译+构建+发布`：也就是说在 `Dockerfile` 中配置网站从构建到发布的完整过程，此方式会速度慢，而且会产生冗余层，增加镜像大小。

## 28.2.2 两种方式构建

### 28.2.2.1 发布后构建

- 👉 发布网站

首先在 `Visual Studio` 或 `dotnet cli` 中发布网站，可以参考 [在 IIS 部署-发布网站](deploy-iis#2611-发布网站)

- 👉 编写 `Dockerfile`

```bash
FROM mcr.microsoft.com/dotnet/aspnet:5.0.1
WORKDIR /app
EXPOSE 80
EXPOSE 443

COPY . .
ENTRYPOINT ["dotnet", "Furion.Web.Entry.dll"]
```

- 👉 将 `Dockerfile` 文件拷贝到发布根目录

将编写好的 `Dockerfile` 文件（注意 `D` 大写）拷贝到发布网站的根目录下。

- 👉 构建 `Docker` 镜像

在网站发布后的路径根目录下（必须含 `Dockerfile`）打开 `CMD/PowerShell` 只需构建命令：

```bash
docker build -t 网站名称:网站版本号 .
```

:::important 特别注意

后端的 `.` 不能省略

:::

- 👉 启动镜像

```bash
docker run --name 容器名称 -p 5000:80 --restart=always -d 网站名称:网站版本号
```

:::tip 发布到 `hub.docker.com`

如果需要将该网站的镜像公开出去，那么可以发布到 `hub.docker.com` 中。发布步骤如下：

- 👉 为镜像打 `tag` 标签

```bash
docker tag 网站名称:网站版本号 docker账号名/网站名称:网站版本号
```

如：

```bash
docker tag furion:v1.8.0 monksoul/furion:v1.8.0
```

- 👉 登录 `docker`

```bash
docker login
```

- 👉 推送到 `hub.docker.com`

```bash
docker push docker账号名/网站名称:网站版本号
```

如：

```bash
docker push monksoul/furion:v1.8.0
```

:::

### 28.2.2.2 编译+构建+发布

此方式可以偷懒，但是不太推荐，不过在某些场景下非常有用，就是集成 `Devops` 工具链可以做到一步到位。

- 👉 编写 `Dockerfile`

这种方式只需要把 `Dockerfile` 内容替换成以下即可：

```bash {6}
FROM mcr.microsoft.com/dotnet/sdk:5.0.1 AS build
WORKDIR /source

# Download Source
RUN git init
RUN git remote add -t master -m master origin 你的源码Git地址
RUN git config core.sparseCheckout true
RUN echo samples >> .git/info/sparse-checkout
RUN git pull --depth 1 origin main

# Restore And Publish
WORKDIR /source/samples
RUN dotnet restore
RUN dotnet publish -c release -o /app --no-restore

# Run
FROM mcr.microsoft.com/dotnet/aspnet:5.0.1
WORKDIR /app
COPY --from=build /app ./
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["dotnet", "Furion.Web.Entry.dll"]
```

- 👉 在 `Dockerfile` 所在路径构建

接下来的步骤和上述步骤一致，不再重复编写

## 28.2.3 反馈与建议

:::note 与我们交流

给 Furion 提 [Issue](https://gitee.com/dotnetchina/Furion/issues/new?issue)。

:::
